import dayjs from 'dayjs';
import { navigateTo, showToast, request, showLoading, hideLoading } from '@tarojs/taro';
import { UPLOAD_FILE } from '/@/api/modules/base/upload';
import { uploadFile } from '@tarojs/taro';
import { getSysImgUrl } from '.';
/**
 * 上传文件名称（服务端要求固定格式命名文件,例如:2023-07-18_09.34.17.515_4727.jpeg）
 *
 * @param {File} file 文件 (为空则不带后缀)
 * @param {*} time 时间 (可由 dayjs 转换的数据，为空则取当前时间)
 *
 * @returns {String} 时间戳+随机数的文件名
 */
function fileNameForUploadFile(suffix: string) {
  const timeStr = dayjs().format('YYYY-MM-DD_HH.mm.ss.SSS'); // 只含路径上能显示的字符
  const random = `${Math.random()}`.slice(-4); // 4 位随机数
  return `${timeStr}_${random}${suffix}`;
}

/**
 * 计算文件大小函数(保留两位小数),返回:xxM xxK XXB
 *size：初始文件大小已字节byte为单位
 */
function getFileSize(size) {
  if (!size) return '';

  let num = 1024.0; //byte

  if (size < num) return size + 'B';
  if (size < Math.pow(num, 2)) return (size / num).toFixed(2) + 'K'; //kb
  if (size < Math.pow(num, 3)) return (size / Math.pow(num, 2)).toFixed(2) + 'M'; //M
}

/**
 *打开档案文件
 *图片文件在当前页面预览，其他文件跳转到对应的页面
 *@param item 档案信息类
 *@param callback 图片预览
 */
function openArchiveTypeFile(item: DossierManager.fileDto, callback: () => void) {
  if (item.enable === 2) {
    showToast({ title: '没有权限查看文件', icon: 'error' });
    return;
  }

  if (!item.url) {
    showToast({ title: '文件地址错误', icon: 'error' });
    return;
  }
  //相对地址转化绝对地址
  const url = getSysImgUrl(item.url);
  //图片类型
  if (item.category === 8 || item.category === 9) {
    callback();
  }

  //doc类型
  if (item.category === 1 || item.category === 2) {
    navigateTo({ url: '/pages/archive-borrow/doc-preview/index?url=' + url });
  }

  //pdf类型
  if (item.category === 7) {
    navigateTo({ url: '/pages/archive-borrow/pdf-preview/index?url=' + url });
  }

  //xls类型
  if (item.category === 3 || item.category === 4) {
    navigateTo({ url: '/pages/archive-borrow/xls-preview/index?url=' + url });
  }

  //ppt类型
  if (item.category === 5 || item.category === 6) {
    navigateTo({ url: '/pages/archive-borrow/ppt-preview/index?url=' + url });
  }
}

/**
 * 档案上传
 * @param file要上传的文件
 * @returns void
 */
function archiveUploadFile(
  file: File,
  successCallback: (
    uploadFileName: string,
    fileSuffix: string,
    url: string,
    fileSize: number,
  ) => void,
) {
  const fileName = file.name;
  const suffix = fileName.substring(fileName.lastIndexOf('.'));
  const size = file.size;
  //1.docx 2.doc 3xlsx 4.xls 5.pptx 6.ppt 7.pdf 8.jpg 9.png
  if (
    !['.docx', '.doc', '.xlsx', '.xls', '.pptx', '.ppt', '.pdf', '.jpg', '.png'].includes(suffix)
  ) {
    showToast({ title: '不支持该格式文件', icon: 'error' });
    return;
  }
  //文件不能大于500M
  if (size > 1024 * 1024 * 500) {
    showToast({ title: '文件不能大于500M', icon: 'error' });
    return;
  }
  const uploadFileName = fileNameForUploadFile(suffix);
  const formData = new FormData();
  const subPaths = `archive,
            ${dayjs().year()},
            ${dayjs().month() + 1},
            ${dayjs().date()}`;

  formData.append('file', file); //  上传时的 blob 文件流
  formData.append('uploadFileName', uploadFileName); // 上传文件名
  formData.append('subPaths', subPaths); // 文件路径,多级用,隔开 如 aaa,bbb,ccc
  formData.append('businessTag', 'service'); // 业务标识
  formData.append('uploadType', '3'); // 上传类型 1 新建 2 更新 3 强制(无则新建,有则更新) 默认1
  formData.append('type', '1'); // 文件类型 1 文件 2 base64; 默认 1
  showLoading();
  request({
    url: UPLOAD_FILE(), //仅为示例，并非真实的接口地址
    data: formData,
    method: 'POST',
    success: function (res) {
      successCallback(uploadFileName, suffix, res.data.subUrl, size);
      console.log(res.data);
    },
    fail: function (res) {
      console.log(res);
      hideLoading();
    },
  });
}

/**
 * 上传图片
 * * * 文件路径规则：存储空间/业务模块(/年月日分级)
 * 存储空间(businessTag)：
 * *public: 公共空间，存放公共资源，这个存储空间不需要添加时间分级，例如图标、地图、模板等不会轻易变更的文件
 * *例如：public/icon/2023-07-01_10.23.48.517_2199.svc
 *
 * *service: 业务空间，存放智建业务资源，这个存储空间需要添加时间分级，例如工单、巡检、问卷等具业务模式的文件
 * *例如：service/questionnaire/2023/7/10/2023-07-01_10.23.48.517_2199.jpg
 *
 * *iot: 物联网空间，存放物联网资源，这个存储空间需要添加时间分级，例如人脸通行照片、车辆通行照片、报警图片等物联网上报文件
 * *例如：iot/park/2023/7/10/2023-07-01_10.23.48.517_2199.jpg
 * @function uploadImageFile
 * @param path string
 * @param filename string
 * @param module string
 * @param type 1 源文件 2 base64编码
 * @param function successCallback 上传成功的回调
 */
function uploadImageFile(
  path: string,
  originalName: string,
  fileName: string,
  module: string,
  successCallback: (url: string) => void,
  type: string = '1',
  content?: string,
) {
  uploadFile({
    url: UPLOAD_FILE(),
    filePath: path,
    fileName: originalName,
    name: 'file',
    formData: {
      uploadFileName: fileName,
      subPaths: `${module},
            ${dayjs().year()},
            ${dayjs().month() + 1},
            ${dayjs().date()}`,
      businessTag: 'service',
      uploadType: '3',
      type,
      content,
    } as UploadFileApi.BaseReq,
    success(res) {
      const data: UploadFileApi.BaseResp = JSON.parse(res.data);
      successCallback(data.subUrl);
    },
  });
}

export {
  fileNameForUploadFile,
  getFileSize,
  openArchiveTypeFile,
  archiveUploadFile,
  uploadImageFile,
};
